Data compression systems are known in the prior art that encode a stream of digital data signals into compressed digital code signals and decode the compressed digital code signals back into the original data. Data compression refers to any process that attempts to convert data in a given format into an alternative format requiring less space than the original. The objective of data compression systems is to effect a savings in the amount of storage required to hold or the amount of time required to transmit a given body of digital information.
To be of practical utility, a general purpose digital data compression system should satisfy certain criteria. The system should have reciprocity. In order for a data compression system to possess the property of reciprocity it must be possible to re-expand or decode the compressed data back into its original form without any alteration or loss of information. The decoded and original data must be identical and indistinguishable with respect to each other. The property of reciprocity is synonymous to that of strict noiselessness used in information theory. Some applications do not require strict adherence to the property of reciprocity. One such application in particular is when dealing with graphical data. Because the human eye is not that sensitive to noise, some alteration or loss of information during the compression de-compression process is acceptable.
The system should provide sufficient performance with respect to the data rates provided by and accepted by the devices with which the data compression and de-compression systems are communicating. The rate at which data can be compressed is determined by the input data processing rate into the compression system, typically in millions of bytes per second (megabytes/sec). Sufficient performance is necessary to maintain the data rates achieved in present day disk, tape and communication systems which rates typically exceed one megabyte/sec. Thus, the data compression and de-compression system must have enough data bandwidth so as to not adversely affect the overall system. The performance of data compression and de-compression systems is typically limited by the computations necessary to compress and de-compress and the speed of the system components such as, random access memory (RAM), and the like, utilized to store statistical data and guide the compression and de-compression process. Performance for a compression device is characterized by the number of processor cycles required per input character under the compressor. The fewer the number of cycles, the higher the performance.
Another important criteria in the design of data compression and de-compression systems is compression effectiveness, which is characterized by the compression ratio. The compression ratio is the ratio of data size in uncompressed form divided by the size in compressed form. In order for data to be compressible, the data must contain redundancy. Compression effectiveness is determined by how effectively the compression procedure uses the redundancy in the input data. In typical computer stored data, redundancy occurs both in the nonuniform usage of individual symbology, example digits, bytes, or characters, and in frequent recurrence of symbol sequences, such as common words, blank record fields and the like.
General purpose data compression procedures are also known in the prior art, three relevant procedures being the Huffman method, the Tunstall method and the Lempel-Ziv method. The Huffman method is widely known and used, reference thereto in article of D. A. Huffman entitled "A Method For Construction Of Minimum Redundancy Codes", Proceedings IRE, 40, 10 pages 1098-1100 (Sep. 1952). Reference to the Tunstall algorithm may be found in Doctoral thesis of B. P. Tunstall entitled "Synthesis of Noiseless Compression Codes", Georgia Institute of Technology (Sept. 1967). Reference may be had to the Lempel-Ziv procedure in a paper authored by J. Ziv and A. Lempel entitled "A Universal Algorithm For Sequential Data Compression", IEEE Transactions on Information Theory, IT-23, 3, pages 337-343 (May, 1977).
One of the first general purpose data compression procedures developed is the Huffman method. Briefly described, the Huffman procedure maps full length segments of symbols into variable length words. The Huffman data compression procedure suffers from two limitations. Firstly, the Huffman procedure operates under the constraint that the input data to be compressed be parsed into fixed length segments of symbols. Although the Huffman procedure provides the best compression ratio that can be obtained under these constraints, when the constraint is relaxed it is possible to obtain significantly better compression ratios by utilizing other procedures. Secondly, Huffman coding requires full knowledge of the statistical characteristic of the source data. The Huffman procedure operates under the assumption that the probability with which each fixed length input segment occurs is known. This requirement of the Huffman procedure can in practice, be satisfied by the use of an adaptive version of the procedure which accumulates the necessary statistics during processing of the data. This, however, is cumbersome, and requires considerable working memory space and performs sub-optimally during adaptation.
The Tunstall algorithm, which maps variable length segments of symbols into fixed length binary words, is complimentary to the Huffman procedure with the fixed length constraints now applied to the output segments instead of the input segments. Like the Huffman procedure, the Tunstall procedure requires a foreknowledge of the source data probabilities. Again this foreknowledge requirement can be satisfied to some degree by utilizing an adaptive version which accumulates the statistics during processing of the data.
The Lempel-Ziv procedure maps variable length segments of the symbols into variable length binary words. It is asymptotically optimal when there are no constraints on the input or output segments. In this procedure the input data string is parsed into adaptively grown segments, each segment consisting of an exact copy of an earlier portion of the input string suffixed by one new symbol from the input data. The copy which is to be made is the longest possible and is not constrained to coincide with any earlier parsed segment. The code word which replaces the segment in the output contains information consisting of a pointer to where the earlier copied portion begins, the length of the copy, and the new symbol.
It would appear that Huffman or Shannon-Fano coding is the perfect means of compressing data. However, this is not the case. As mentioned above, these coding methods are optimal when and only when the symbol probabilities are integral powers of 1/2, which is usually not the case.
The technique of arithmetic coding does not have this restriction: It achieves the same effect as treating the message as one single unit (a technique which would, for Huffman coding, require enumeration of every single possible message), and thus attains the theoretical entropy bound to compression efficiency for any source.
In arithmetic coding, one decision after another is encoded to define successfully smaller, lesser included intervals along a number line. Additional information on arithmetic coding can be found in "An Introduction To Arithmetic Encoding"; by G. G. Langdon, Jr., IBM Journal of Research and Development, Vol. 28, n. 2, Mar. 1984, 135-149; and "Arithmetic Compression Code Control Parameters Approximation"; by D. R. Helman, G. G. Langdon, Jr., and J. J. Rissanen, Vol. 23, n. 11, Apr. 1981, 5112-5114 and U.S. Pat. No. 4,905,297, "Arithmetic Coding Encoder And Decoder System", Langdon, Jr. et al. all incorporated herein by reference.
As noted in the above articles, arithmetic coding provides that each decision has a plurality of possible exclusive outcomes "or events". Each outcome or event is represented in data by a symbol. In the imaging environment, for example, each decision may correspond to whether or not a given pixel is black. The decision outcome being represented by a Y (or YES) symbol if the pixel is black or an N (or NO) symbol if the pixel is not black. Thus, a plurality of decisions may then be represented by a sequence of symbols, e.g., YNNY . . .
In accordance with prior arithmetic coding teachings, a probability line has a current interval defined thereon. The first current interval is 0 to 1. The current interval is divided into segments in which segment corresponds to one possible outcome for the next decision. Where there are only two possible outcomes for each decision, the current interval is divided into two segments. The length of each segment is based on its respective associated probability. The respective probabilities may remain fixed or may adapt as decision data is entered.
It is the correlating of large segments to symbols which occur with greater frequency that leads to the compression effect. In the former cited article ("An Introduction To Arithmetic Encoding"), a 4-symbol arithmetic coding example is set forth in which each decision can result in an "a" event (having a 50% probability), a "b" event (having a 25% probability), a "c" event (having a 12.5% probability), or a "d" event (having a 12.5% probability). Representing the four events in binary form would require two bits for each decision, where the events would be represented respectively by 00, 01, 10, 11. For three decisions such as "aab" which is highly likely, the straight forward encoding data would be 00 00 01; requiring six bits. However, as observed in the article at page 137, the arithmetic coding approach permits the sequence "aab" to be represented by the value 0.001. Instead of six bits, the information can be represented in three bits. This conservation of bits results as successive events having relatively high associated probabilities occur.
The conservation deteriorates if numerous events occur for which there are low probabilities and relatively short line segments. With the above noted probabilities, a sequence of events "dd" would be represented with encoded data as 1111 whereas, by arithmetic coding, the "dd" events would be represented by 111111. Provided that the larger segments in fact correspond to events that occur with correspondingly greater frequency, the additional bits needed for less probable symbols are outweighed by the conservation achieved when more probable symbols occur.
Arithmetic coding adapts to data throughout the entire compression run and never forgets the past. This is counter to many LZ based schemes which are constantly losing the contents of their dictionaries. LZ rebuilds the dictionary, thus adapting to the next section of data. For LZ schemes, a 1 KB of data compresses just as well as a 100 KB of data. Arithmetic coding continues to improve it's probabilities throughout the run, which means that it will not do as well on 1 KB of data because it has not had the chance to optimize its adaptations. However, arithmetic coding compresses the 1 KB better than LZ.
Arithmetic coding uses a probability table to store statistics on the image. As each bit is compressed, the table is accessed to determine how the bit should be handled. The larger the table, the slower it moves to a final/optimal state. The larger the table, however, the better the compression ratios for larger images because more information is available for each bit. Simple experiments have shown the break point for benefiting from a larger table to be around 10 KB--after that point, larger tables yield a significantly better compression ratio.
In the operation of the printers, several different types of images are created. Some images are 100 KB to 200 KB in size, other images may be as small as 400 B or even smaller. A major contributor these small images is a font cache. Each unique character is first created and stored in the font cache before printing begins. Depending on the page, the amount of space used by the font cache may be an issue for successful rendering of the page.
Font usage becomes more critical if the same printer is used in a LAN environment. Several different users can send print jobs with their own preference for fonts and point sizes. With each new job, the printer determines if the requested character set already resides in the font cache from previous jobs. If it does not exist, then the time is taken to render the character. As the printer's memory is populated with font cache characters, there comes a point where those characters not immediately in demand must be removed from the font cache to make room for the other characters. Thus, the longer font cache characters stay around--especially across several jobs--the faster users receive their printouts. It is not uncommon for the wait for the font cache creation to be a noticeable amount of time. This is most often noticed when printing the first page after a power-on.